package cn.puge.insurance.utils;

import lombok.Data;

import java.util.HashMap;
import java.util.Map;

/**
 * @author Ljh
 * @date 2025/11/12
 * 文件说明：统一返回数据的包装类，用于接口返回结果的标准化封装
 */
@Data
public class R<T> {

    /**
     * 操作是否成功
     */
    private Boolean success;
    /**
     * 状态码（自定义业务码）
     */
    private Integer code;
    /**
     * 提示消息
     */
    private String message;
    /**
     * 附加数据（多字段场景）
     */
    private Map<String, Object> data = new HashMap<>();
    /**
     * 泛型结果（单对象/集合场景）
     */
    private T result;

    // 私有构造器，禁止外部直接实例化
    private R() {
    }

    // ==================== 成功场景方法 ====================

    /**
     * 基础成功返回
     */
    public static R ok() {
        R r = new R();
        r.setSuccess(true);
        r.setCode(0);
        r.setMessage("成功");
        return r;
    }

    /**
     * 成功返回 + 自定义提示消息
     */
    public static R ok(String message) {
        return ok().message(message);
    }

    /**
     * 成功返回 + 附加数据（Map）
     */
    public static R ok(Map<String, Object> data) {
        return ok().setData(data);
    }

    /**
     * 成功返回 + 泛型结果（单对象/集合）
     */
    public static <T> R<T> ok(T result) {
        R<T> r = new R<>();
        r.setSuccess(true);
        r.setCode(0);
        r.setMessage("成功");
        r.setResult(result);
        return r;
    }

    /**
     * 成功返回 + 泛型结果 + 自定义提示消息
     */
    public static <T> R ok(T result, String message) {
        return ok(result).message(message);
    }

    // ==================== 失败场景方法 ====================

    /**
     * 基础失败返回
     */
    public static R error() {
        R r = new R();
        r.setSuccess(false);
        r.setCode(-1);
        r.setMessage("失败");
        return r;
    }

    /**
     * 失败返回 + 自定义提示消息
     */
    public static R error(String message) {
        return error().message(message);
    }

    /**
     * 失败返回 + 自定义业务码 + 提示消息
     */
    public static R error(Integer code, String message) {
        return error().setCode(code).message(message);
    }

    /**
     * 失败返回 + 附加数据（Map）
     */
    public static R error(Map<String, Object> data) {
        return error().setData(data);
    }

    /**
     * 失败返回 + 附加数据 + 自定义提示消息
     */
    public static R error(Map<String, Object> data, String message) {
        return error(message).setData(data);
    }

    // ==================== 数据操作与链式调用 ====================

    /**
     * 向附加数据中添加单个键值对
     */
    public R put(String key, Object value) {
        this.data.put(key, value);
        return this; // 链式调用支持
    }

    /**
     * 向附加数据中批量添加键值对
     */
    public R putAll(Map<String, Object> map) {
        this.data.putAll(map);
        return this;
    }

    // 以下为链式调用的Setter方法（替代Lombok默认的void返回Setter）
    public R setSuccess(Boolean success) {
        this.success = success;
        return this;
    }

    public R setCode(Integer code) {
        this.code = code;
        return this;
    }

    public R message(String message) {
        this.message = message;
        return this;
    }

    public R setData(Map<String, Object> data) {
        this.data = data;
        return this;
    }

    public R setResult(T result) {
        this.result = result;
        return this;
    }

    public R data(String key, Object value) {
        this.data.put(key, value);
        return this;
    }
}